import random

import pygame.sprite

# 窗口大小 480像素 * 700像素
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新的帧频
FRAME_PER_SEC = 60


class GameSprite(pygame.sprite.Sprite):
    """飞机大战-精灵类"""

    def __init__(self, image_url, speed=1):
        """
        初始化
        :param image_url: 图片路径
        :param speed: 移动频率（默认1）
        """
        # 使用super调用父类初始化（继续类不是Object，则需要调用）
        super().__init__()
        # 绘制图片
        self.image = pygame.image.load(image_url)
        # 获取坐标、宽高
        self.rect = self.image.get_rect()
        # 移动频率
        self.speed = speed

    def update(self):
        """
        更新精灵位置
        """
        self.rect.y += self.speed


class BackGround(GameSprite):
    """飞机大战-背景类"""

    def __init__(self, is_alt):
        """
        背景图片初始化
        """
        super().__init__("./images/D:/人工智能作业fat-tiger-homework/课程设计(飞机大战)/图片素材\微信图片_20240618091218.jpg")
        # 定义图片y值
        if is_alt:
            self.rect.y = self.rect.height

    def update(self):
        """
        更新图片位置
        """
        super().update()
        # 背景图片大于屏幕高度则赋值当前窗口高度的负数值
        if self.rect.y >= SCREEN_RECT.height:
            self.rect.y = -self.rect.height


class Enemy(GameSprite):
    """飞机大战-敌机类"""

    def __init__(self):
        """
        敌机初始化
        """
        super().__init__("./images/D:/人工智能作业fat-tiger-homework/课程设计(飞机大战)/图片素材/微信图片_20240618091202.jpg")
        # 指定敌机的随机速度
        self.speed = random.randint(1, 3)
        # 指定敌机的随机位置（窗口宽度-敌机宽度）
        self.rect.bottom = 0
        self.rect.x = random.randint(0, SCREEN_RECT.width - self.rect.width)
        # 敌机爆炸状态 0：未摧毁 1：待摧毁 1-4：摧毁中 5：已摧毁
        self.enemy_explode_index = 0

    def update(self):
        """
        更新敌机位置
        """
        super().update()
        # 敌机大于当前窗口高度时从精灵组里删除敌机
        if self.rect.y > SCREEN_RECT.height:
            self.kill()
        # 已销毁敌机
        if self.enemy_explode_index == 5:
            return
        # 敌机爆炸
        if self.enemy_explode_index != 0:
            new_rect = self.rect
            super().__init__("./images/D:/人工智能作业fat-tiger-homework/课程设计(飞机大战)/图片素材/微信图片_20240618101718.jpg" % self.enemy_explode_index)
            self.enemy_explode_index += 1
            self.rect = new_rect


class Me(GameSprite):
    """飞机大战-主机类"""

    def __init__(self):
        """
        主机初始化
        """
        super().__init__("./images/D:/人工智能作业fat-tiger-homework/课程设计(飞机大战)/图片素材\微信图片_20240618102703.jpg", 0)
        # 指定主机的x轴中心位置
        self.rect.centerx = SCREEN_RECT.centerx
        # 指定主机的位置y轴位置(窗口宽度-敌机宽度-50)
        self.rect.y = SCREEN_RECT.height - self.rect.height - 50
        # 创建子弹精灵组
        self.bullet_group = pygame.sprite.Group()
        # 主机爆炸状态 1：喷气 2：不喷气 3：摧毁 4：已摧毁
        self.state = 1
        # 主机爆炸进度 1-4
        self.progress = 1

    def update(self, is_move=False, is_left=False):
        """
        更新主机位置
        :param is_move: 是否移动
        :param is_left: 是否左移动
        :return:
        """
        # 获取上个精灵的位置
        new_rect = self.rect
        # 喷气和不喷气相互切换
        if self.state == 1:
            super().__init__("./images/D:/人工智能作业fat-tiger-homework/课程设计(飞机大战)/图片素材/微信图片_20240618091202.jpg")
            self.state = 2
        elif self.state == 2:
            super().__init__("./images/D:/人工智能作业fat-tiger-homework/课程设计(飞机大战)/图片素材/微信图片_20240618102703.jpg")
            self.state = 1
        # 主机被摧毁
        else:
            super().__init__("./images/D:/人工智能作业fat-tiger-homework/课程设计(飞机大战)/图片素材/微信图片_20240618101718.jpg" % self.progress)
            self.rect = new_rect
            # 主机已被摧毁
            if self.progress != 4:
                self.progress += 1
            else:
                self.state = 4
            return
        # 将上个精灵的位置赋值到新的精灵上
        self.rect = new_rect
        if not is_move:
            return
        # 左右移动
        if is_left and self.rect.x > 0:
            self.rect.x -= 2
        elif not is_left and self.rect.right < SCREEN_RECT.width:
            self.rect.x += 2

    def me_bullet(self):
        """
        主机添加子弹
        :return:
        """
        for i in range(0, 3):
            # 添加子弹精灵到精灵组中
            bullet = Bullet()
            # 子弹x+y轴位置
            bullet.rect.y = self.rect.y - i * 20
            bullet.rect.x = self.rect.centerx
            # 将子弹精灵添加到精灵组中
            self.bullet_group.add(bullet)


class Bullet(GameSprite):
    """飞机大战-子弹类"""

    def __init__(self):
        """
        子弹初始化
        """
        super().__init__("./images/D:/人工智能作业fat-tiger-homework/课程设计(飞机大战)/图片素材/微信图片_20240618092317.jpg", -2)

    def update(self):
        """
        发射子弹
        :return:
        """
        super().update()
        # 子弹y轴高度小于等于0时从精灵组里删除
        if self.rect.y <= 0:
            self.kill()